import java.io.*;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        File[] rootfiles = File.listRoots();
        for (int i = 0; i < rootfiles.length; i++) {
            System.out.println(i+1+rootfiles[i].getAbsolutePath());
        }

        Scanner sc=new Scanner(System.in);
        int c=0;
        //判断操作数是否合理
        while (true){
            System.out.println("请要目标文件的盘符->");
           c = sc.nextInt();
            if(c>0&&c<=rootfiles.length)break;
        }
        System.out.println(rootfiles[c-1]);
        File fromfile=chosedir(rootfiles,c,sc);
        if(fromfile==null)return;
        System.out.println(fromfile.getAbsolutePath());
        for (int i = 0; i < rootfiles.length; i++) {
            System.out.println(i+1+rootfiles[i].getAbsolutePath());
        }
        c=1;
        //判断操作数是否合理
        while (true){
            System.out.println("请选择复制文件的盘符->");
            c = sc.nextInt();
            if(c>0&&c<= rootfiles.length)break;
        }
        File tofile=chosedir(rootfiles,c,sc);
        System.out.println("请输入复制文件名");
        String str=sc.next();
        File copyfile=new File(tofile.getAbsoluteFile(),str);
        System.out.println(fromfile.getAbsolutePath());
        dircopy(fromfile,copyfile);
    }

    private static File chosedir(File[] files, int c,Scanner sc) {
        if(files==null)
    {
        System.out.println("当前文件夹为空");
        return null;
    }
        File file = files[c-1];
        if(file.isFile()){
            return file;
        }
        System.out.println("是否继续选择路径(Y/N)-->");
        String ensure = sc.next();
       if(ensure.equals("N"))return file;
        File[] fromfiles = file.listFiles();
        for (int i = 0; i < fromfiles.length; i++) {
            System.out.println(i+1+"  "+fromfiles[i].getAbsolutePath());
        }
        int a=0;
        //判断操作数是否合理
        while (true){
            System.out.println("请选择路径->");
            a = sc.nextInt();
            if(a>0&&a< fromfiles.length)break;
        }
        return chosedir(fromfiles,a,sc);
    }

    /**
     * 将目标文件夹复制到复制文件夹中
     * @param fromfile 目标文件夹
     * @param tofile 复制文件夹
     */
    private static void dircopy(File fromfile, File tofile) {
        //新建复制文件夹
        tofile.mkdirs();
        //获取当前目录所以文件和文件夹
        File[] files = fromfile.listFiles();
        //初始化目录长度变量
        int len=0;
        //新建数组,短暂存在1K数据
        byte[] b=new byte[1024];
        //判断文件夹是否为空
        if(files==null){
            System.out.println("当前路径无文件");
            return;
        }
        //在循环外声明输入流和输出流
        FileInputStream fileInputStream= null;
        FileOutputStream fileOutputStream=null;
        //遍历目录
        for (File file : files) {
            //判断file为文件还是文件夹
            if (file.isFile()) {
                //找不到文件的异常处理
                try {
                    //为目标文件创建文件输入流
                    fileInputStream = new FileInputStream(file);
                    //为复制文件创建文件输出流
                    fileOutputStream = new FileOutputStream(new File(tofile, file.getName()));
                } catch (FileNotFoundException e) {
                    //打印异常
                    e.printStackTrace();
                }
                while (true) {
                    //io流异常处理
                    try {
                        //读取文件数据到数组中,并返回读取数据长度
                        len = fileInputStream.read(b);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    //若长度为-1 则文件结束
                    if (len == -1)
                        break;
                    //文件异常处理
                    try {
                        //将数组中的数据写入文件
                        fileOutputStream.write(b, 0, len);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

            } else {//若为文件夹,则递归调用复制方法
                //将当前路径和文件夹名传入
                dircopy(file, new File(tofile, file.getName()));
            }
        }
        try {
           if(fileOutputStream!=null)
               fileOutputStream.close();
           if(fileInputStream!=null)
               fileInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
